/**
 * @file WarehouseLineBean.java
 * Projet eCOM 2010 (Miage Descartes)
 * @author Doido Sébastien
 * @version 2
 * @brief Bean relatif au traitement d'une ligne d'inventaire
 */
package ecom.beans;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.io.Serializable;
import javax.ejb.Remote;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
 * @brief Bean relatif au traitement d'une ligne d'inventaire
 * @author Sebastien
 */
@Entity
@Table(name = "STOCK")
@Remote(WarehouseLineRemote.class)
@NamedQueries({
    @NamedQuery(name = "getStockByProductAndStore", query = "SELECT p FROM WarehouseLineBean p where p.product.productId = :productID AND p.store.reference = :productStoreID"),
    @NamedQuery(name = "getProductByPriceInterval", query = "SELECT p FROM WarehouseLineBean p where p.productPrice >= :min AND p.productPrice <= :max"),
    @NamedQuery(name = "getProductsInStore", query = "SELECT p FROM WarehouseLineBean p where p.store.reference = :productStoreID"),
    @NamedQuery(name = "getProductsByProductId", query = "SELECT p FROM WarehouseLineBean p where p.product.productId = :productID"),
    @NamedQuery(name = "getAllStocks", query = "SELECT p FROM WarehouseLineBean p"),
    @NamedQuery(name = "getProductByName", query = "SELECT p FROM WarehouseLineBean p where p.product.productName = :name"),
    @NamedQuery(name = "getProductByNameLike", query = "SELECT p FROM WarehouseLineBean p where p.product.productName like :name"),
    @NamedQuery(name = "getProductByCategory", query = "SELECT p FROM WarehouseLineBean p where p.product.category.idCateg = :categ")
})
public class WarehouseLineBean implements Serializable {

    /**
     * @brief Identifiant unique de la ligne de stock
     */
    @Id
    @Column(name = "id_stock", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer idLine;

    /**
     * @brief Produit de la ligne de stock
     */
    @JoinColumn(name = "product_id", referencedColumnName = "product_id", nullable = false)
    @ManyToOne
    private ProductBean product;

    /**
     * @brief Magasin vendant le produit de la ligne de stock
     */
    @JoinColumn(name = "store_id", referencedColumnName = "product_store_id", nullable = false)
    @ManyToOne
    private ProductStoreBean store;

    /**
     * @brief Quantité de la ligne de stock pour le couple produit/magasin
     */
    @Column(name = "quantity", nullable = false)
    private int quantity;

    /**
     * @brief Prix de la ligne de stock pour le couple produit/magasin
     */
    @Column(name = "price", nullable = false)
    private double productPrice;


    public WarehouseLineBean() {
    }

    /**
     * @brief Constructeur de ligne de stock
     * @param store : magasin
     * @param product : produit
     * @param quantity : quantité disponible
     * @param price : prix de vente
     */
    public WarehouseLineBean(ProductStoreBean store, ProductBean product, int quantity, double price) {
        this();
        this.store = store;
        this.product = product;
        this.quantity = quantity;
        this.productPrice = price;
    }

    /**
     * @brief renvoie l'identifiant unique de la ligne de stock
     * @return l'identifiant unique de la ligne de stock
     */
    public Integer getIdLine() {
        return idLine;
    }

    /**
     * @brief Renvoie le produit de la ligne d'inventaire
     * @return le produit de la ligne d'inventaire
     */
    public ProductBean getProduct() {
        return product;
    }

    /**
     * @brief Renvoie le magasin de la ligne d'inventaire
     * @return le magasin de la ligne d'inventaire
     */
    public ProductStoreBean getStore() {
        return store;
    }

    /**
     * @brief Renvoie la quantité disponible pour la ligne d'inventaire
     * @return la quantité disponible pour la ligne d'inventaire
     */
    public int getQuantity() {
        return quantity;
    }

    /**
     * @brief Renvoie le prix de vente pour la ligne d'inventaire
     * @return le prix de vente pour la ligne d'inventaire
     */
    public double getProductPrice() {
        return productPrice;
    }

    @Override
    public String toString() {
        return "Store #" + this.getStore().getReference() + " | " + this.getStore().getName() + " - " + 
               "Product #" + this.getProduct().getProductId() + " | " + this.getProduct().getProductName() + " - " +
               "Quantity: " + this.getQuantity() + " - " + "Price: " + this.getProductPrice() + "\n";
    }

    /**
     * @brief Définit la quantité disponible pour la ligne d'inventaire
     * @param quantity
     */
    public void setQuantity(int quantity) {
        this.quantity = quantity;
        Connection con = null;

        try {
            Class.forName ("com.mysql.jdbc.Driver").newInstance ();
            con = DriverManager.getConnection("jdbc:mysql://localhost/ecom", "ecom", "ecom");
            Statement s = con.createStatement();
            s.executeUpdate("update stock set quantity = '" + quantity + "' where id_stock = " + this.getIdLine());
            s.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void setIdLine(Integer idLine) {
        this.idLine = idLine;
    }

    public void setProduct(ProductBean product) {
        this.product = product;
    }

    public void setProductPrice(double productPrice) {
        this.productPrice = productPrice;
    }

    public void setStore(ProductStoreBean store) {
        this.store = store;
    }
}
